class Solution
{
public:
    int minSubarray(vector<int> &nums, int p)
    {
        int n = nums.size();
        nums[0] %= p;
        for (int i = 1; i < n; ++i)
        {
            nums[i] += nums[i - 1];
            nums[i] %= p;
        }
        if (nums[n - 1] == 0)
        {
            return 0;
        }
        int minSubLen = n;
        unordered_map<int, int> modLastOccur;
        modLastOccur[0] = -1;
        for (int i = 0; i < n; ++i)
        {
            if (modLastOccur.count((p - nums[n - 1] + nums[i]) % p))
            {
                minSubLen = min(minSubLen, i - modLastOccur[(p - nums[n - 1] + nums[i]) % p]);
            }
            modLastOccur[nums[i]] = i;
        }
        return minSubLen == n ? -1 : minSubLen;
    }
};